<?php
/** [模型逻辑模型]
 * @Author: 976123967@qq.com
 * @Date:   2015-01-09 17:38:09
 * @Last Modified by:   chenli
 * @Last Modified time: 2015-03-05 23:48:37
 */
class ModelLogic extends Model{

	public $model;
	// 表名称
	protected $tabelName = 'model';
	private $cache;


	/**
	 * [$_validate 自动验证]
	 * @var array
	 */
	protected $_validate = array(
		array('name','require','请输入表名称',1),
		array('name','/^[a-z][a-z0-9_]*$/i','表名称必须以字母开头并且只能包含字母或数字或下划线',1,'regex',3),
		array('name','check_name','表名称重复',1,'callback',2),
		array('remark','require','请输入模型名称',1),
	);

	/**
	 * [check_remark 检查表名称重复]
	 * @param  [type] $con [description]
	 * @return [type]      [description]
	 */
	public function check_name($con)
	{
		$where['name'] 	= $con;
		$mid 			= I('post.mid');
		if($mid)
			$where['mid'] = array('neq',$mid);
		if(!$this->model->where($where)->find())
			return ture;
		else
			return false;

	}

	/**
	 * [_initialize 初始化]
	 * @return [type] [description]
	 */
	public function _initialize()
	{
		$this->model = D('Model');
		$this->cache = S('model');
	}

	/**
	 * [get_all 读取所有模型]
	 * @return [type] [description]
	 */
	public function get_all()
	{
		return $this->cache;
	}

	/**
	 * [update_cache 更新缓存]
	 * @return [type] [description]
	 */
	public function update_cache()
	{
		// 所有模型
		$data = $this->order(array('mid'=>'asc'))->select();
		$temp = array();
		if($data)
		{
			// 处理对应关系
			foreach($data as $k=>$v)
			{
				$temp[$v['mid']] = $v;
			}
		}
		
		// 写缓存
		S('model',$temp);
	}

	/**
	 * [find_one 查找一条记录]
	 * @return [type] [description]
	 */
	public function find_one()
	{
		$mid  = I('get.mid');
		if(!$this->cache)
		{
			$this->error = '模型不存在';
			return false;
		}

		foreach($this->cache as $k=>$v)
		{
			if($k==$mid)
			{
				return $v;
			}
		}
		$this->error = '模型不存在';
		return false;
	}


	/**
	 * [update_model 更新数据]
	 * @return [type] [description]
	 */
	public function update_model()
	{
		
		// 验证
		if(!$this->create())
			return false;


		/***更改表结构***/
		// 旧表名
		$mid = I('post.mid',null,'intval');
		$oldename = $this->where(array('mid'=>$mid))->getField('name');
		// 新表名
		$name = I('post.name');
		// 模型名称
		$remark = I('post.remark');
		// 执行更新
		$this->model->alter_edit_table(array('oldename'=>$oldename,'name'=>$name,'remark'=>$remark));

		/***更改数据库***/
		// 执行更新
		$this->save();

		/***更新缓存***/
		$this->update_cache();

		return true;
	}


	/**
	 * [add_model 添加模型]
	 */
	public function add_model()
	{
		// 验证
		if(!$this->create())
			return false;

		$mid = $this->add();

		// 添加表
		$name = I('post.name');
		$remark = I('post.remark');
		$this->model->alter_add_table(array('name'=>$name,'remark'=>$remark,'mid'=>$mid));
		

		
		

		/***更新缓存***/
		$this->update_cache();

		// 更新字段缓存
		D('Field','Logic')->update_cache();

		return true;
	}

	/**
	 * [delete_model 删除模型]
	 * @return [type] [description]
	 */
	public function delete_model()
	{
		$mid = I('get.mid');
		// 验证必须存在
		if(!$data = $this->find($mid))
		{
			$this->error = '模型不存在';
			return false;
		}
		// 删除表
		$this->model->alter_drop_table($data);

		// 删除模型
		$this->delete($mid);


		/***删除字段***/
		// 实例化 字段逻辑层模型
		$fieldLogic = D('Field','Logic');
		// 找到当前模型的所有字段
		$field = $fieldLogic->get_all_by_model_mid($mid);
		// 判断是否有字段
		if($field)
		{
			// 实例化 字段数据层模型
			$modelFieldModel = D('ModelField');
			// 实例化 字段默认值数据层模型
			$modelFieldValueModel = D('ModelFieldValue');
			foreach($field as $v)
			{
				// 执行字段删除 通过主键fid
				$modelFieldModel->delete($v['fid']);
				// 执行字段默认值删除 通过关联外键field_fid
				$modelFieldValueModel->where(array('field_fid'=>$v['fid']))->delete();
			}
		}

		// 更新模型缓存
		$this->update_cache();
		// 更新字段缓存
		$fieldLogic->update_cache();
		return true;
	}
}